package co.edu.usbcali.rebio.presentation.backEndBeans;

import co.edu.usbcali.rebio.exceptions.*;
import co.edu.usbcali.rebio.modelo.*;
import co.edu.usbcali.rebio.modelo.dto.RebDepartamentoDTO;
import co.edu.usbcali.rebio.presentation.businessDelegate.BusinessDelegatorView;
import co.edu.usbcali.rebio.utilities.*;

import com.icesoft.faces.async.render.RenderManager;
import com.icesoft.faces.async.render.Renderable;
import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlSelectOneMenu;
import com.icesoft.faces.component.selectinputdate.SelectInputDate;
import com.icesoft.faces.context.DisposableBean;
import com.icesoft.faces.webapp.xmlhttp.FatalRenderingException;
import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
import com.icesoft.faces.webapp.xmlhttp.RenderingException;
import com.icesoft.faces.webapp.xmlhttp.TransientRenderingException;

import java.awt.event.KeyEvent;
import java.math.BigDecimal;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import java.util.Vector;

import javax.faces.event.ValueChangeEvent;
import javax.faces.model.DataModel;
import javax.faces.model.SelectItem;


/**
 *
 *
 * @author Zathura Code Generator http://code.google.com/p/zathura
 *
 */
public class RebDepartamentoView extends DataSource implements Renderable,
DisposableBean {
	private HtmlInputText txtDetEstado;
	private HtmlInputText txtDetNombre;
	private HtmlInputText txtDetCodigo;
	private HtmlSelectOneMenu cmbDetEstado;
	private HtmlCommandButton btnSave;
	private HtmlCommandButton btnModify;
	private HtmlCommandButton btnDelete;
	private HtmlCommandButton btnClear;
	private boolean renderDataTable;
	private boolean flag = true;
	private HtmlCommandButton bntAceptar;
	private boolean btnErrorf = false;
	private RenderManager renderManager;
	private PersistentFacesState state = PersistentFacesState.getInstance();
	private List<RebDepartamento> rebDepartamento;
	private List<RebDepartamentoDTO> rebDepartamentoDTO;
	private List<SelectItem> listEstado;
	

	public RebDepartamentoView() {
		super("");
	}

	public String action_clear() {
		cmbDetEstado.setValue(null);
		cmbDetEstado.setDisabled(false);
		txtDetNombre.setValue(null);
		txtDetNombre.setDisabled(false);
		txtDetCodigo.setValue(null);
		txtDetCodigo.setDisabled(false);
		btnSave.setDisabled(false);
		btnDelete.setDisabled(true);
		btnModify.setDisabled(true);
		btnClear.setDisabled(false);

		return "";
	}

	public void listener_txtId(ValueChangeEvent event) {
		if ((event.getNewValue() != null) && !event.getNewValue().equals("")) {
			RebDepartamento entity = null;

			try {
				Integer detCodigo = new Integer(txtDetCodigo.getValue()
						.toString());
				entity = BusinessDelegatorView.getRebDepartamento(detCodigo);
			} catch (Exception e) {
				// TODO: handle exception
			}

			if (entity == null) {
				cmbDetEstado.setDisabled(false);
				txtDetNombre.setDisabled(false);
				txtDetCodigo.setDisabled(false);
				btnSave.setDisabled(false);
				btnDelete.setDisabled(true);
				btnModify.setDisabled(true);
				btnClear.setDisabled(false);
			} else {
				cmbDetEstado.setValue(entity.getDetEstado());
				cmbDetEstado.setDisabled(false);
				txtDetNombre.setValue(entity.getDetNombre());
				txtDetNombre.setDisabled(false);
				txtDetCodigo.setValue(entity.getDetCodigo());
				txtDetCodigo.setDisabled(true);
				btnSave.setDisabled(true);
				btnDelete.setDisabled(false);
				btnModify.setDisabled(false);
				btnClear.setDisabled(false);
			}
		}
	}

	public void action_cargar(String detCodigo) {

		RebDepartamento entity = null;

		if (detCodigo != null){
			try {
				int codigo = Integer.parseInt(detCodigo);
				entity = BusinessDelegatorView.getRebDepartamento(codigo);
			} catch (Exception e) {
				// TODO: handle exception
			}

			if (entity == null) {
				cmbDetEstado.setDisabled(false);
				txtDetNombre.setDisabled(false);
				txtDetCodigo.setDisabled(false);
				btnSave.setDisabled(false);
				btnDelete.setDisabled(true);
				btnModify.setDisabled(true);
				btnClear.setDisabled(false);
			} else {
				cmbDetEstado.setValue(entity.getDetEstado());
				cmbDetEstado.setDisabled(false);
				txtDetNombre.setValue(entity.getDetNombre());
				txtDetNombre.setDisabled(false);
				txtDetCodigo.setValue(entity.getDetCodigo());
				txtDetCodigo.setDisabled(true);
				btnSave.setDisabled(true);
				btnDelete.setDisabled(false);
				btnModify.setDisabled(false);
				btnClear.setDisabled(false);
			}
		}
	}
	
	 public String action_cerrar2(){
			btnErrorf = false;
			return "";
	}
	public String action_save() {
		try {
			
			String estado = cmbDetEstado.getValue().toString();
			String detNombre = txtDetNombre.getValue().toString().toUpperCase();
			
			if(!Utilities.soloLetras(detNombre)){
				throw new Exception("El Nombre del Departamento debe contener solo letras");
			}
			
			if(detNombre.trim().equals("")){
				throw new Exception("El Nombre del Departamento es de car&#225;cter obligatorio");
			}
			
			if (estado.trim().equals("") || estado.equals("Seleccionar Un Estado")) {
				throw new Exception(
				"El Estado del Departamento es de car&#225;cter obligatorio, debes seleccionar alguno");
			}
			
			//BusinessDelegatorView.saveRebDepartamento(null, estado, detNombre);
			BusinessDelegatorView.saveRebDepartamento(null, estado, detNombre);
			btnErrorf = true;
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			
			onePageDataModel = null;
			renderManager.getOnDemandRenderer("rebDepartamentoView").requestRender();
			
			action_clear();
		} catch (Exception e) {
			btnErrorf = true;
			bntAceptar.requestFocus();
			FacesUtils.addErrorMessage(e.getMessage());
//			FacesUtils.addInfoMessage(e.getMessage());
		
		}

		return "";
	}

	public String action_delete() {
		try {
			BusinessDelegatorView.deleteRebDepartamento(FacesUtils.checkInteger(
					txtDetCodigo));
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}
	
	public String action_Inactivar() {
		try {

			String est = "INACTIVO";
			Integer id = Integer.parseInt(txtDetCodigo.getValue().toString());
			String estado = cmbDetEstado.getValue().toString();
			String detNombre = txtDetNombre.getValue().toString().toUpperCase();
			
			if(!Utilities.soloLetras(detNombre)){
				throw new Exception("El Nombre del Departamento debe contener solo letras");
			}
			
			if(detNombre.trim().equals("")){
				throw new Exception("El Nombre del Departamento es de car&#225;cter obligatorio");
			}
			
			if (estado.trim().equals("") || estado.equals("Seleccionar Un Estado")) {
				throw new Exception("El Estado del Departamento es de car&#225;cter obligatorio, debes seleccionar alguno");
			}
			
			BusinessDelegatorView.updateRebDepartamento(id, est, detNombre);
			btnErrorf = true;
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
			
			onePageDataModel = null;
			renderManager.getOnDemandRenderer("rebDepartamentoView").requestRender();
			
			action_clear();
		} catch (Exception e) {
			btnErrorf = true;
			bntAceptar.requestFocus();
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
			
			Integer id = Integer.parseInt(txtDetCodigo.getValue().toString());
			String estado = cmbDetEstado.getValue().toString();
			String detNombre = txtDetNombre.getValue().toString().toUpperCase();
			
			if(!Utilities.soloLetras(detNombre)){
				throw new Exception("El Nombre del Departamento debe contener solo letras");
			}
			
			if(detNombre.trim().equals("")){
				throw new Exception("El Nombre del Departamento es de car&#225;cter obligatorio");
			}
			
			if (estado.trim().equals("") || estado.equals("Seleccionar Un Estado")) {
				throw new Exception("El Estado del Departamento es de car&#225;cter obligatorio, debes seleccionar alguno");
			}
			
			BusinessDelegatorView.updateRebDepartamento(id, estado, detNombre);
			btnErrorf = true;
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
			
			onePageDataModel = null;
			renderManager.getOnDemandRenderer("rebDepartamentoView").requestRender();
			
			action_clear();
		} catch (Exception e) {
			btnErrorf = true;
			bntAceptar.requestFocus();
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modifyWitDTO(Integer detCodigo, String detEstado,
			String detNombre) throws Exception {
		try {
			BusinessDelegatorView.updateRebDepartamento(detCodigo, detEstado,
					detNombre);
			renderManager.getOnDemandRenderer("RebDepartamentoView")
			.requestRender();
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			//renderManager.getOnDemandRenderer("RebDepartamentoView").requestRender();
			FacesUtils.addErrorMessage(e.getMessage());
			throw e;
		}

		return "";
	}

	public List<RebDepartamento> getRebDepartamento() {
		if (flag) {
			try {
				rebDepartamento = BusinessDelegatorView.getRebDepartamento();
				flag = false;
			} catch (Exception e) {
				flag = true;
				FacesUtils.addErrorMessage(e.getMessage());
			}
		}

		return rebDepartamento;
	}

	public boolean isFlag() {
		return flag;
	}

	public void setRebDepartamento(List<RebDepartamento> rebDepartamento) {
		this.rebDepartamento = rebDepartamento;
	}

	public boolean isRenderDataTable() {
		try {
			if (flag) {
				if (BusinessDelegatorView.findTotalNumberRebDepartamento() > 0) {
					renderDataTable = true;
				} else {
					renderDataTable = false;
				}
			}

			flag = false;
		} catch (Exception e) {
			renderDataTable = false;
			e.printStackTrace();
		}

		return renderDataTable;
	}

	public DataModel getData() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModel(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and
	 * returned as a list of objects for display in the UI.
	 */
	private DataPage<RebDepartamento> getDataPage(int startRow, int pageSize) {
		// Retrieve the total number of objects from the database.  This
		// number is required by the DataPage object so the paginator will know
		// the relative location of the page data.
		int totalNumberRebDepartamento = 0;

		try {
			totalNumberRebDepartamento = BusinessDelegatorView.findTotalNumberRebDepartamento()
			.intValue();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Calculate indices to be displayed in the ui.
		int endIndex = startRow + pageSize;

		if (endIndex > totalNumberRebDepartamento) {
			endIndex = totalNumberRebDepartamento;
		}

		try {
			rebDepartamento = BusinessDelegatorView.findPageRebDepartamento(sortColumnName,
					sortAscending, startRow, endIndex - startRow);

			// Remove this Renderable from the existing render groups.
			//leaveRenderGroups();        			
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Add this Renderable to the new render groups.
		//joinRenderGroups();
		// Reset the dirtyData flag.
		onePageDataModel.setDirtyData(false);
		// This is required when using Hibernate.  If the SessionManager is not
		// cleared or closed objects are cached and stale objects will show up
		// in the table.
		// This way, the detached objects are reread from the database.
		// This call is not required with Hibernate, which uses a Query Hint
		// to clear the l2 cache in the DAO.
		flag = true;

		return new DataPage<RebDepartamento>(totalNumberRebDepartamento,
				startRow, rebDepartamento);
	}

	public DataModel getDataDTO() {
		state = PersistentFacesState.getInstance();

		if (onePageDataModel == null) {
			onePageDataModel = new LocalDataModelDTO(pageSize);
		}

		return onePageDataModel;
	}

	/**
	 * This is where the Object data is retrieved from the database and
	 * returned as a list of objects for display in the UI.
	 */
	private DataPage<RebDepartamentoDTO> getDataPageDTO(int startRow,
			int pageSize) {
		// Retrieve the total number of objects from the database.  This
		// number is required by the DataPage object so the paginator will know
		// the relative location of the page data.
		int totalNumberRebDepartamento = 0;

		try {
			totalNumberRebDepartamento = BusinessDelegatorView.findTotalNumberRebDepartamento()
			.intValue();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Calculate indices to be displayed in the ui.
		int endIndex = startRow + pageSize;

		if (endIndex > totalNumberRebDepartamento) {
			endIndex = totalNumberRebDepartamento;
		}

		try {
			rebDepartamento = BusinessDelegatorView.findPageRebDepartamento(sortColumnName,
					sortAscending, startRow, endIndex - startRow);

			if (Utilities.validationsList(rebDepartamento)) {
				rebDepartamentoDTO = new ArrayList<RebDepartamentoDTO>();

				for (RebDepartamento rebDepartamentoTmp : rebDepartamento) {
					RebDepartamentoDTO rebDepartamentoDTO2 = new RebDepartamentoDTO();
					rebDepartamentoDTO2.setDetCodigo(rebDepartamentoTmp.getDetCodigo()
							.toString());
					rebDepartamentoDTO2.setDetEstado((rebDepartamentoTmp.getDetEstado() != null)
							? rebDepartamentoTmp.getDetEstado().toString() : null);
					rebDepartamentoDTO2.setDetNombre((rebDepartamentoTmp.getDetNombre() != null)
							? rebDepartamentoTmp.getDetNombre().toString() : null);
					rebDepartamentoDTO2.setRebDepartamento(rebDepartamentoTmp);
					rebDepartamentoDTO2.setRebDepartamentoView(this);
					rebDepartamentoDTO.add(rebDepartamentoDTO2);
				}
			}

			// Remove this Renderable from the existing render groups.
			leaveRenderGroups();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		// Add this Renderable to the new render groups.
		joinRenderGroups();
		// Reset the dirtyData flag.
		onePageDataModel.setDirtyData(false);
		// This is required when using Hibernate.  If the SessionManager is not
		// cleared or closed objects are cached and stale objects will show up
		// in the table.
		// This way, the detached objects are reread from the database.
		// This call is not required with Hibernate, which uses a Query Hint
		// to clear the l2 cache in the DAO.
		flag = true;

		return new DataPage<RebDepartamentoDTO>(totalNumberRebDepartamento,
				startRow, rebDepartamentoDTO);
	}

	protected boolean isDefaultAscending(String sortColumn) {
		return true;
	}

	/**
	 * This method is called when a render call is made from the server. Render
	 * calls are only made to views containing an updated record. The data is
	 * marked as dirty to trigger a fetch of the updated record from the
	 * database before rendering takes place.
	 */
	public PersistentFacesState getState() {
		onePageDataModel.setDirtyData();

		return state;
	}

	/**
	 * This method is called from faces-config.xml with each new session.
	 */
	public void setRenderManager(RenderManager renderManager) {
		this.renderManager = renderManager;
	}

	public void renderingException(RenderingException arg0) {
		if (arg0 instanceof TransientRenderingException) {
		} else if (arg0 instanceof FatalRenderingException) {
			// Remove from existing Customer render groups.
			leaveRenderGroups();
		}
	}

	/**
	 * Remove this Renderable from existing uiCustomerBeans render groups.
	 * OnDemandRenderers are named/created using the underlying Customer Number.
	 */
	private void leaveRenderGroups() {
		if (Utilities.validationsList(rebDepartamentoDTO)) {
			for (RebDepartamentoDTO rebDepartamentoTmp : rebDepartamentoDTO) {
				renderManager.getOnDemandRenderer("RebDepartamentoView")
				.remove(this);
			}
		}
	}

	/**
	 * Add this Renderable to the new uiCustomerBeans render groups.
	 * OnDemandRenderers are named/created using the underlying Customer Number.
	 */
	private void joinRenderGroups() {
		if (Utilities.validationsList(rebDepartamentoDTO)) {
			for (RebDepartamentoDTO rebDepartamentoTmp : rebDepartamentoDTO) {
				renderManager.getOnDemandRenderer("RebDepartamentoView")
				.add(this);
			}
		}
	}

	public void dispose() throws Exception {
	}

	public RenderManager getRenderManager() {
		return renderManager;
	}

	public void setState(PersistentFacesState state) {
		this.state = state;
	}

	public HtmlInputText getTxtDetEstado() {
		return txtDetEstado;
	}

	public void setTxtDetEstado(HtmlInputText txtDetEstado) {
		this.txtDetEstado = txtDetEstado;
	}

	public HtmlInputText getTxtDetNombre() {
		return txtDetNombre;
	}

	public void setTxtDetNombre(HtmlInputText txtDetNombre) {
		this.txtDetNombre = txtDetNombre;
	}

	public HtmlInputText getTxtDetCodigo() {
		return txtDetCodigo;
	}

	public void setTxtDetCodigo(HtmlInputText txtDetCodigo) {
		this.txtDetCodigo = txtDetCodigo;
	}

	public HtmlSelectOneMenu getCmbDetEstado() {
		listEstado = new ArrayList<SelectItem>();
		try {
			listEstado.clear();
			listEstado.add(new SelectItem("Seleccionar Un Estado"));
			listEstado.add(new SelectItem("ACTIVO"));
			listEstado.add(new SelectItem("INACTIVO"));
		} catch (Exception e) {
			// TODO: handle exception
		}

		return cmbDetEstado;
	}

	public void setCmbDetEstado(HtmlSelectOneMenu cmbDetEstado) {
		this.cmbDetEstado = cmbDetEstado;
	}
	public HtmlCommandButton getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(HtmlCommandButton btnSave) {
		this.btnSave = btnSave;
	}

	public HtmlCommandButton getBtnModify() {
		return btnModify;
	}

	public void setBtnModify(HtmlCommandButton btnModify) {
		this.btnModify = btnModify;
	}

	public HtmlCommandButton getBtnDelete() {
		return btnDelete;
	}

	public void setBtnDelete(HtmlCommandButton btnDelete) {
		this.btnDelete = btnDelete;
	}

	public HtmlCommandButton getBtnClear() {
		return btnClear;
	}

	public void setBtnClear(HtmlCommandButton btnClear) {
		this.btnClear = btnClear;
	}

	public void setRenderDataTable(boolean renderDataTable) {
		this.renderDataTable = renderDataTable;
	}

	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	
	public HtmlCommandButton getBntAceptar() {
		return bntAceptar;
	}

	public void setBntAceptar(HtmlCommandButton bntAceptar) {
		this.bntAceptar = bntAceptar;
	}

	public boolean isBtnErrorf() {
		return btnErrorf;
	}

	public void setBtnErrorf(boolean btnErrorf) {
		this.btnErrorf = btnErrorf;
	}

	public List<SelectItem> getListEstado() {
		return listEstado;
	}

	public void setListEstado(List<SelectItem> listEstado) {
		this.listEstado = listEstado;
	}

	public List<RebDepartamentoDTO> getRebDepartamentoDTO() {
		return rebDepartamentoDTO;
	}

	public void setRebDepartamentoDTO(
			List<RebDepartamentoDTO> rebDepartamentoDTO) {
		this.rebDepartamentoDTO = rebDepartamentoDTO;
	}
	
	

	

	public TimeZone getTimeZone() {
		return java.util.TimeZone.getDefault();
	}

	/**
	 * A special type of JSF DataModel to allow a datatable and datapaginator
	 * to page through a large set of data without having to hold the entire
	 * set of data in memory at once.
	 * Any time a managed bean wants to avoid holding an entire dataset,
	 * the managed bean declares this inner class which extends PagedListDataModel
	 * and implements the fetchData method. fetchData is called
	 * as needed when the table requires data that isn't available in the
	 * current data page held by this object.
	 * This requires the managed bean (and in general the business
	 * method that the managed bean uses) to provide the data wrapped in
	 * a DataPage object that provides info on the full size of the dataset.
	 */
	private class LocalDataModel extends PagedListDataModel {
		public LocalDataModel(int pageSize) {
			super(pageSize);
		}

		public DataPage<RebDepartamento> fetchPage(int startRow, int pageSize) {
			// call enclosing managed bean method to fetch the data
			return getDataPage(startRow, pageSize);
		}
	}

	private class LocalDataModelDTO extends PagedListDataModel {
		public LocalDataModelDTO(int pageSize) {
			super(pageSize);
		}

		public DataPage<RebDepartamentoDTO> fetchPage(int startRow, int pageSize) {
			// call enclosing managed bean method to fetch the data
			return getDataPageDTO(startRow, pageSize);
		}
	}
}
